// 签章颜色：红、蓝、黑
let colors = ['red', 'blue', '#000'];
// 签章字体：sealFont自定义刻章字体 @/assets/font/font.css
let fonts = ['sealFont', 'SimSun', 'SimHei'];
// 印章绘制配置
let baseConf = {color: null, mainFont: null, seaNoFont: null};
// 党徽图片素材（注意：必须页面初始化预加载）
let dhImage = new Image();

// ============================================ 印章绘制设置 ============================================

/**
 * 初始化加载党徽图片
 */
export function initDhImage() {
  dhImage.src = require("@/static/images/dh.png");
}

/**
 * 印章颜色、字体设置
 * @param cType 颜色设置 0.红、1.蓝、2.黑
 * @param fType 字体设置 0.刻章字体、1.宋体、2.黑体
 */
export function commonMethod(cType, fType) {
  // 印章颜色设置
  let color = colors[cType];
  if (color === undefined || color == 'undefined') {
    color = colors[0];
  }
  // 印章字体设置
  let font = fonts[fType];
  if (font === undefined || font == 'undefined') {
    font = fonts[0];
  }
  // 印章颜色
  baseConf.color = color;
  // 印章主体字体
  baseConf.mainFont = fonts;
  // 印章底部序列号字体
  baseConf.seaNoFont = fonts[2];
}

// ============================================ 圆形印章 ============================================

/**
 * 绘制圆形印章（无英文）
 *
 * @param company 公司名称
 * @param title 印章标题
 * @param sealNo 章底部的序列号
 * @param pattern 是否绘制中间图案 0不绘制 1.五角星 2.党徽
 * @param insideCircle 是否绘制印章内圆：0否；1是
 * @param cType 颜色 0.红 1.蓝色 2.黑色
 * @param fType 字体 0.刻章字体 0.宋体 1.黑体
 */
export function companyCircularChinese(company, title, sealNo, pattern, insideCircle, cType, fType) {
  // 获取canvans doc对象
  let canvas = document.createElement("canvas");
  let context = canvas.getContext('2d');

  // 印章尺寸
  canvas.width = 600;
  canvas.height = 600;

  let width = canvas.width / 2;
  let height = canvas.height / 2;

  // 印章颜色、字体设置
  commonMethod(cType, fType);
  // 绘制印章外圆
  drawCircle();
  // 绘制印章中间图案
  drawMiddlePattern(pattern);
  // 绘制印章内圆
  drawInsideCircle(insideCircle);
  // 绘制印章标题
  drawTitleFont(title);
  // 绘制签章序列号
  writeSerlNo(sealNo);
  // 绘制公司名称
  writeCompanyNameFont(company);
  // 返回图片base64
  return canvas.toDataURL();

  /**
   * 绘制印章外圆
   */
  function drawCircle() {
    context.translate(0, 0);
    context.lineWidth = 15;
    context.strokeStyle = baseConf.color;
    context.beginPath();
    context.arc(width, height, 293, 0, Math.PI * 2);
    context.stroke();
    context.save();
  }

  /**
   * 绘制印章内圆
   */
  function drawInsideCircle(insideCircle) {
    if (insideCircle == 0) {
      return;
    }
    context.translate(0, 0);
    context.lineWidth = 3;
    context.strokeStyle = baseConf.color;
    context.beginPath();
    context.arc(width, height, 278, 0, Math.PI * 2);
    context.stroke();
    context.save();
  }

  /**
   * 绘制印章中间图案
   */
  function drawMiddlePattern(pattern) {
    if (pattern == 1) {
      // 五角星
      draw5Start();
    } else if (pattern == 2) {
      // 党徽
      drowEmblemImage();
    }
  }

  /**
   * 绘制印章五角星
   */
  function draw5Start() {
    context.save();
    context.fillStyle = baseConf.color;
    //移动坐标原点  中心点开始绘制
    context.translate(width, height);
    //旋转
    context.rotate(Math.PI);
    context.beginPath();
    let dig = Math.PI / 5 * 4
    for (let i = 0; i < 5; i++) {
      let x = Math.sin(i * dig);
      let y = Math.cos(i * dig);
      context.lineTo(x * 90, y * 90);
    }
    context.closePath();
    context.stroke();
    context.fill();
    context.restore();
  }

  /**
   * 绘制党徽图片
   */
  function drowEmblemImage() {
    // 党徽直径
    let diameter = 200;
    context.save();
    context.translate(-(diameter / 2), -(diameter / 2));//移动坐标原点
    context.drawImage(dhImage, width, height, diameter, diameter);
    context.restore();
  }

  /**
   * 绘制印章标题
   */
  function drawTitleFont(title) {
    // 绘制印章名称
    context.font = '68px ' + baseConf.mainFont;
    context.textBaseline = 'middle';//设置文本的垂直对齐方式
    context.textAlign = 'center'; //设置文本的水平对对齐方式
    context.lineWidth = 1;
    context.fillStyle = baseConf.color;
    context.fillText(title, width, height + 170, width);// context.fillText(text, x, y, maxWidth); maxWidth:此参数指定文本允许的最大宽度。它是可选的。
  }

  /**
   * 绘制公司名称
   */
  function writeCompanyNameFont() {
    context.font = '85px ' + baseConf.mainFont;
    let count = company.length;// 字数
    let angle = -4 * Math.PI / (3 * (count - 1));// 字间角度
    let chars = company.split("");
    let trueChars = chars.reverse();
    let c;
    for (let i = 0; i < count; i++) {
      c = trueChars[i];// 需要绘制的字符
      if (i == 0)
        context.rotate(5 * Math.PI / 6.1);
      else
        context.rotate(angle);
      context.save();
      context.translate(230, 0);// 平移到此位置,此时字和x轴垂直，第一个参数是与圆外边的距离，越大距离越近
      context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
      if (count < 20) {
        context.fillText(c, 0, 8);// 此点为字的中心点
      } else {
        context.fillText(c, 0, 8, 45);// 此点为字的中心点
      }
      context.restore();
    }
  }

  /**
   * 绘制签章序列号
   */
  function writeSerlNo(sealNo) {
    if (sealNo == null || sealNo.length == 0) {
      // 这个逻辑是为了防止签章序列号为空时候印章绘制出现角度不对的情况（填充18位空格）
      sealNo = "                  ";
    }
    context.translate(width, height);
    context.font = '36px ' + baseConf.seaNoFont;
    let count = sealNo.length;// 字数
    let angle = -2 * Math.PI / (6 * (count - 1));// 字间角度
    let chars = sealNo.split("");

    for (let i = 0; i < count; i++) {
      let c = chars[i];// 需要绘制的字符
      if (i == 0)
        context.rotate(10 * Math.PI / 5.95);
      else
        context.rotate(angle);
      context.save();
      context.translate(-250, 5);// 平移到此位置,此时字和x轴垂直，第一个参数是与圆外边的距离，越大距离越近
      context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
      context.fillStyle = baseConf.color;
      context.fillText(c, 0, 5);// 此点为字的中心点
      context.restore();
    }
  }
}

/**
 * 绘制圆形印章（中英文：英文在外圆）
 *
 * @param company 公司名称
 * @param title 印章标题
 * @param sealNo 章底部的序列号
 * @param pattern 是否绘制中间图案 0不绘制 1.五角星 2.党徽
 * @param insideCircle 是否绘制印章内圆：0否；1是
 * @param cType 颜色 0.红 1.蓝色 2.黑色
 * @param fType 字体 0.刻章字体 0.宋体 1.黑体
 */
export function companyCircularEnglishOuter(company, englishName, sealNo, cType, fType) {
  // 获取canvans doc对象
  let canvas = document.createElement("canvas");
  let context = canvas.getContext('2d');

  // 印章尺寸
  canvas.width = 600;
  canvas.height = 600;

  let width = canvas.width / 2;
  let height = canvas.height / 2;

  // 印章颜色、字体设置
  commonMethod(cType, fType);
  // 绘制印章外圆
  drawCircle();
  // 绘制印章内圆
  drawInsideCircle();
  // 绘制签章序列号
  writeSerlNo(sealNo);
  // 绘制英文公司名称(外圆 英文)
  writeEnglishNameFont(englishName);
  // 绘制中文公司名称(内圆 中文)
  writeChineseNameFont(company);
  // 返回图片base64
  return canvas.toDataURL();

  /**
   * 绘制印章外圆
   */
  function drawCircle() {
    context.translate(0, 0);
    context.lineWidth = 10;
    context.strokeStyle = baseConf.color;
    context.beginPath();
    context.arc(width, height, 293, 0, Math.PI * 2);
    context.stroke();
    context.save();
  }

  /**
   * 绘制印章内圆
   */
  function drawInsideCircle() {
    context.translate(0, 0);
    context.lineWidth = 3;
    context.strokeStyle = baseConf.color;
    context.beginPath();
    context.arc(width, height, 210, 0, Math.PI * 2);
    context.stroke();
    context.save();
  }

  /**
   * 绘制英文公司名称(外圆 英文)
   */
  function writeEnglishNameFont(words) {
    context.font = '58px SimSun';
    let count = words.length;// 字数
    let angle = -4 * Math.PI / (3 * (count - 1));// 字间角度
    let chars = words.split("");
    let trueChars = chars.reverse();
    let c;
    for (let i = 0; i < count; i++) {
      c = trueChars[i];// 需要绘制的字符
      if (i == 0)
        context.rotate(5 * Math.PI / 6.1);
      else
        context.rotate(angle);
      context.save();
      context.translate(238, 0);// 平移到此位置,此时字和x轴垂直，第一个参数是与圆外边的距离，越大距离越近
      context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
      context.fillStyle = baseConf.color;
      context.fillText(c, 0, 8, 15);// 此点为字的中心点
      context.restore();
    }
  }

  /**
   *  绘制中文公司名称(内圆 中文)
   */
  function writeChineseNameFont(words) {
    context.font = '58px ' + baseConf.mainFont;
    let count = words.length;// 字数
    let angle = -4 * Math.PI / (3 * (count - 1));// 字间角度
    let chars = words.split("");
    let trueChars = chars.reverse();
    let c;
    for (let i = 0; i < count; i++) {
      c = trueChars[i];// 需要绘制的字符
      if (i == 0)
        context.rotate(8 * Math.PI / 6.1);
      else
        context.rotate(angle);
      context.save();
      context.translate(140, 0);// 平移到此位置,此时字和x轴垂直，第一个参数是与圆外边的距离，越大距离越近
      context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
      context.fillStyle = baseConf.color;
      if (count < 20) {
        context.fillText(c, 0, 8);// 此点为字的中心点
      } else if (15 < count < 20) {
        context.fillText(c, 0, 8, 30);// 此点为字的中心点
      } else {
        context.fillText(c, 0, 8, 20);// 此点为字的中心点
      }
      context.restore();
    }
  }

  /**
   * 绘制签章序列号
   */
  function writeSerlNo(sealNo) {
    if (sealNo == null || sealNo.length == 0) {
      // 这个逻辑是为了防止签章序列号为空时候印章绘制出现角度不对的情况（填充18位空格）
      sealNo = "                  ";
    }
    context.translate(width, height);
    context.font = '36px SimSun';
    let count = sealNo.length;// 字数
    let angle = -2 * Math.PI / (6 * (count - 1));// 字间角度
    let chars = sealNo.split("");

    for (let i = 0; i < count; i++) {
      let c = chars[i];// 需要绘制的字符
      if (i == 0)
        context.rotate(10 * Math.PI / 5.95);
      else
        context.rotate(angle);
      context.save();
      context.translate(-270, 5);// 平移到此位置,此时字和x轴垂直，第一个参数是与圆外边的距离，越大距离越近
      context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
      context.fillStyle = baseConf.color;
      context.fillText(c, 0, 5);// 此点为字的中心点
      context.restore();
    }
  }
}

/**
 * 绘制圆形印章（中英文：英文在内圆）
 *
 * @param company 公司名称
 * @param title 印章标题
 * @param sealNo 章底部的序列号
 * @param pattern 是否绘制中间图案 0不绘制 1.五角星 2.党徽
 * @param insideCircle 是否绘制印章内圆：0否；1是
 * @param cType 颜色 0.红 1.蓝色 2.黑色
 * @param fType 字体 0.刻章字体 0.宋体 1.黑体
 */
export function companyCircularEnglishInner(company, englishName, sealNo, cType, fType) {
  // 获取canvans doc对象
  let canvas = document.createElement("canvas");
  let context = canvas.getContext('2d');

  // 印章尺寸
  canvas.width = 600;
  canvas.height = 600;

  let width = canvas.width / 2;
  let height = canvas.height / 2;

  // 印章颜色、字体设置
  commonMethod(cType, fType);
  // 绘制印章外圆
  drawCircle();
  // 绘制印章内圆
  drawInsideCircle();
  // 绘制签章序列号
  writeSerlNo(sealNo);
  // 绘制中文公司名称(外圆 中文)
  writeChineseNameFont(company);
  // 绘制英文公司名称(内圆 英文)
  writeEnglishNameFont(englishName);
  // 返回图片base64
  return canvas.toDataURL();

  /**
   * 绘制印章外圆
   */
  function drawCircle() {
    context.translate(0, 0);
    context.lineWidth = 10;
    context.strokeStyle = baseConf.color;
    context.beginPath();
    context.arc(width, height, 293, 0, Math.PI * 2);
    context.stroke();
    context.save();
  }

  /**
   * 绘制印章内圆
   */
  function drawInsideCircle() {
    context.translate(0, 0);
    context.lineWidth = 3;
    context.strokeStyle = baseConf.color;
    context.beginPath();
    context.arc(width, height, 210, 0, Math.PI * 2);
    context.stroke();
    context.save();
  }

  /**
   * 绘制中文公司名称(外圆 中文)
   */
  function writeChineseNameFont(words) {
    context.font = '58px ' + baseConf.mainFont;
    let count = words.length;// 字数
    let angle = -4 * Math.PI / (3 * (count - 1));// 字间角度
    let chars = words.split("");
    let trueChars = chars.reverse();
    let c;
    for (let i = 0; i < count; i++) {
      c = trueChars[i];// 需要绘制的字符
      if (i == 0)
        context.rotate(5 * Math.PI / 6.1);
      else
        context.rotate(angle);
      context.save();
      context.translate(230, 0);// 平移到此位置,此时字和x轴垂直，第一个参数是与圆外边的距离，越大距离越近
      context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
      context.fillStyle = baseConf.color;
      if (count < 20) {
        context.fillText(c, 0, 8);// 此点为字的中心点
      } else {
        context.fillText(c, 0, 8, 45);// 此点为字的中心点
      }
      context.restore();
    }
  }

  /**
   * 绘制英文公司名称(内圆 英文)
   */
  function writeEnglishNameFont(words) {
    context.font = '58px  SimSun';
    let count = words.length;// 字数
    let angle = -4 * Math.PI / (3 * (count - 1));// 字间角度
    let chars = words.split("");
    let trueChars = chars.reverse();
    let c;
    for (let i = 0; i < count; i++) {
      c = trueChars[i];// 需要绘制的字符
      if (i == 0)
        context.rotate(8 * Math.PI / 6.1);
      else
        context.rotate(angle);
      context.save();
      context.translate(165, 0);// 平移到此位置,此时字和x轴垂直，第一个参数是与圆外边的距离，越大距离越近
      context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
      context.fillStyle = baseConf.color;
      context.fillText(c, 0, 8, 15);// 此点为字的中心点
      context.restore();
    }
  }

  /**
   * 绘制签章序列号
   */
  function writeSerlNo(sealNo) {
    if (sealNo == null || sealNo.length == 0) {
      // 这个逻辑是为了防止签章序列号为空时候印章绘制出现角度不对的情况（填充18位空格）
      sealNo = "                  ";
    }
    context.translate(width, height);
    context.font = '36px SimSun';
    let count = sealNo.length;// 字数
    let angle = -2 * Math.PI / (6 * (count - 1));// 字间角度
    let chars = sealNo.split("");

    for (let i = 0; i < count; i++) {
      let c = chars[i];// 需要绘制的字符
      if (i == 0)
        context.rotate(10 * Math.PI / 5.95);
      else
        context.rotate(angle);
      context.save();
      context.translate(-270, 5);// 平移到此位置,此时字和x轴垂直，第一个参数是与圆外边的距离，越大距离越近
      context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
      context.fillStyle = baseConf.color;
      context.fillText(c, 0, 5);// 此点为字的中心点
      context.restore();
    }
  }
}

// ============================================ 椭圆印章 ============================================

/**
 * 绘制椭圆签章（无英文）
 *
 * @param company 公司名称
 * @param title 印章标题
 * @param sealNo 章底部的序列号
 * @param cType 颜色 0.红 1.蓝色 2.黑色
 * @param fType 字体 0.刻章字体 0.宋体 1.黑体
 */
export function companyEllipseChinese(company, title, sealNo, cType, fType) {
  let canvas = document.createElement("canvas");
  let context = canvas.getContext('2d');

  // 印章尺寸
  canvas.width = 600;
  canvas.height = 428;

  //椭圆长轴半径
  let radiusX = (canvas.width - 6) / 2;
  //短轴半径
  let radiusY = (canvas.height - 6) / 2;

  // 印章颜色、字体设置
  commonMethod(cType, fType);
  // 绘制顶部企业名称
  writeFont(true, company);
  // 绘制底部印章标题
  writeFont(false, sealNo);
  // 绘制印章标题
  drawTitleFont(title);
  // 绘制椭圆
  drawEllipse();

  /**
   * 绘制 印章 环绕文字
   * @param isTop true顶部环绕文字，false底部环绕文字
   * @param words 绘制文字内容
   */
  function writeFont(isTop, words) {
    // 文字跨度
    let totalArcAng;
    // 文字字体
    let font;
    // 从边线向中心的移动因子
    let minRat;

    // isTop：true顶部环绕文字；false底部环绕文字
    if (isTop) {
      // 文字跨度
      totalArcAng = 240;
      // 文字大小、字体
      font = "68px " + baseConf.mainFont;
      // 从边线向中心的移动因子
      minRat = 2.8;
    } else {
      // 文字跨度
      totalArcAng = 80;
      // 文字大小、字体
      font = "36px " + baseConf.seaNoFont;
      // 从边线向中心的移动因子
      minRat = 2.0;
    }

    let fontTextLen = words.length;
    let radiusWidth = radiusX + context.lineWidth;
    let radiusHeight = radiusY + context.lineWidth;

    //起始角度
    let startAngle = isTop == true ? -90 - totalArcAng / 2 : 90 - totalArcAng / 2;
    let step = 0.5;
    let alCount = Math.ceil(totalArcAng / step) + 1;
    let angleArr = new Array(alCount);
    let arcLenArr = new Array(alCount);
    let num = 0;
    let accArcLen = 0;
    angleArr[num] = startAngle;
    arcLenArr[num] = accArcLen;
    num++;
    let angR = startAngle * Math.PI / 180;
    let lastX = radiusX * Math.cos(angR) + radiusWidth;
    let lastY = radiusY * Math.sin(angR) + radiusHeight;

    for (let i = startAngle + step; num < alCount; i += step) {
      angR = i * Math.PI / 180;
      let x = radiusX * Math.cos(angR) + radiusWidth;
      let y = radiusY * Math.sin(angR) + radiusHeight;
      accArcLen += Math.sqrt((lastX - x) * (lastX - x) + (lastY - y) * (lastY - y));
      angleArr[num] = i;
      arcLenArr[num] = accArcLen;
      lastX = x;
      lastY = y;
      num++;
    }

    let arcPer = accArcLen / fontTextLen;
    for (let i = 0; i < fontTextLen; i++) {
      let arcL = i * arcPer + arcPer / 2;
      let ang = 0;

      for (let p = 0; p < arcLenArr.length - 1; p++) {
        if (arcLenArr[p] <= arcL && arcL <= arcLenArr[p + 1]) {
          ang = (arcL >= ((arcLenArr[p] + arcLenArr[p + 1]) / 2)) ? angleArr[p + 1] : angleArr[p];
          break;
        }
      }
      angR = (ang * Math.PI / 180);
      let x = radiusX * Math.cos(angR) + radiusX;
      let y = radiusY * Math.sin(angR) + radiusY;
      let qxang = Math.atan2(radiusY * Math.cos(angR), -radiusX * Math.sin(angR));
      let fxang = qxang + Math.PI / 2;

      let subIndex = isTop == true ? i : fontTextLen - 1 - i;
      let c = words[subIndex];
      let w = 25;
      let h = 31;

      if (!isTop) {
        w = 2;
        h = 10;
      }

      x += (h * minRat) * Math.cos(fxang);
      y += (h * minRat) * Math.sin(fxang);
      if (isTop) {
        x += -w / 2 * Math.cos(qxang);
        y += -w / 2 * Math.sin(qxang);
      } else {
        x += w / 2 * Math.cos(qxang);
        y += w / 2 * Math.sin(qxang);
      }

      context.save()
      context.translate(x, y);
      if (isTop == true) {
        context.rotate((fxang * 180 / Math.PI - 90) * Math.PI / 180)
      } else {
        context.rotate((fxang * 180 / Math.PI + 180 - 90) * Math.PI / 180)
      }
      context.translate(-x, -y)
      context.fillStyle = baseConf.color;
      context.font = font;
      if (fontTextLen < 20) {
        context.fillText(c, x, y);
      } else {
        context.fillText(c, x, y, 35);
      }
      context.restore();
    }
  }

  /**
   * 绘制印章标题
   */
  function drawTitleFont(title) {
    context.fillStyle = baseConf.color;
    context.font = '58px ' + baseConf.mainFont;
    context.textAlign = 'center';
    context.fillText(title, radiusX, radiusY + 120, radiusX);// context.fillText(text, x, y, maxWidth); maxWidth:此参数指定文本允许的最大宽度。它是可选的。
    context.restore();
  }

  /**
   * 绘制椭圆
   */
  function drawEllipse() {
    context.ellipse(radiusX + context.lineWidth + 2, radiusY + context.lineWidth + 2, radiusX - 2, radiusY - 2, 0, 0, Math.PI * 2);
    context.fillStyle = 'rgba(255, 255, 255, 0)'; //背景透明
    context.strokeStyle = baseConf.color;
    context.lineWidth = 10;
    context.fill();
    context.stroke();
  }

  //返回图片base64
  return canvas.toDataURL();
}


/**
 * 绘制椭圆签章（中英文）
 *
 * @param company 公司名称
 * @param ecompany 英文公司名称
 * @param sealNo 章底部的序列号
 * @param cType 颜色 0.红 1.蓝色 2.黑色
 * @param fType 字体 0.刻章字体 0.宋体 1.黑体
 */
export function companyEllipseEnglish(company, ecompany, sealNo, cType, fType) {
  let canvas = document.createElement("canvas");
  let context = canvas.getContext('2d');

  // 印章尺寸
  canvas.width = 600;
  canvas.height = 428;

  //椭圆长轴半径
  let radiusX = (canvas.width - 6) / 2;
  //短轴半径
  let radiusY = (canvas.height - 6) / 2;

  // 印章颜色、字体设置
  commonMethod(cType, fType);
  // 绘制顶部英文企业名称
  writeFont(true, ecompany);
  // 绘制底部印章标题
  writeFont(false, sealNo);
  // 绘制内圆中文企业名称
  writeChineseFont(company);
  // 绘制外围椭圆
  drawEllipse(10, radiusX + 2, radiusY + 2, radiusX - 4, radiusY - 4);
  // 绘制内椭圆
  drawEllipse(3, radiusX + 2, radiusY + 2, radiusX - 80, radiusY - 80);

  /**
   * 绘制 印章 环绕文字
   * @param isTop true顶部环绕文字，false底部环绕文字
   * @param words 绘制文字内容
   */
  function writeFont(isTop, words) {
    // 文字跨度
    let totalArcAng;
    // 文字字体
    let font;
    // 从边线向中心的移动因子
    let minRat;

    // isTop：true顶部环绕文字；false底部环绕文字
    if (isTop) {
      // 文字跨度
      totalArcAng = 240;
      // 文字大小、字体
      font = "58px SimSun";
      // 从边线向中心的移动因子
      minRat = 2.1;
    } else {
      // 文字跨度
      totalArcAng = 80;
      // 文字大小、字体
      font = "36px SimSun";
      // 从边线向中心的移动因子
      minRat = 2.0;
    }

    let fontTextLen = words.length;
    let radiusWidth = radiusX + context.lineWidth;
    let radiusHeight = radiusY + context.lineWidth;

    //起始角度
    let startAngle = isTop == true ? -90 - totalArcAng / 2 : 90 - totalArcAng / 2;
    let step = 0.5;
    let alCount = Math.ceil(totalArcAng / step) + 1;
    let angleArr = new Array(alCount);
    let arcLenArr = new Array(alCount);
    let num = 0;
    let accArcLen = 0;
    angleArr[num] = startAngle;
    arcLenArr[num] = accArcLen;
    num++;
    let angR = startAngle * Math.PI / 180;
    let lastX = radiusX * Math.cos(angR) + radiusWidth;
    let lastY = radiusY * Math.sin(angR) + radiusHeight;

    for (let i = startAngle + step; num < alCount; i += step) {
      angR = i * Math.PI / 180;
      let x = radiusX * Math.cos(angR) + radiusWidth;
      let y = radiusY * Math.sin(angR) + radiusHeight;
      accArcLen += Math.sqrt((lastX - x) * (lastX - x) + (lastY - y) * (lastY - y));
      angleArr[num] = i;
      arcLenArr[num] = accArcLen;
      lastX = x;
      lastY = y;
      num++;
    }

    let arcPer = accArcLen / fontTextLen;
    for (let i = 0; i < fontTextLen; i++) {
      let arcL = i * arcPer + arcPer / 2;
      let ang = 0;

      for (let p = 0; p < arcLenArr.length - 1; p++) {
        if (arcLenArr[p] <= arcL && arcL <= arcLenArr[p + 1]) {
          ang = (arcL >= ((arcLenArr[p] + arcLenArr[p + 1]) / 2)) ? angleArr[p + 1] : angleArr[p];
          break;
        }
      }
      angR = (ang * Math.PI / 180);
      let x = radiusX * Math.cos(angR) + radiusX;
      let y = radiusY * Math.sin(angR) + radiusY;
      let qxang = Math.atan2(radiusY * Math.cos(angR), -radiusX * Math.sin(angR));
      let fxang = qxang + Math.PI / 2;

      let subIndex = isTop == true ? i : fontTextLen - 1 - i;
      let c = words[subIndex];
      let w = 25;
      let h = 31;

      if (!isTop) {
        w = 2;
        h = 10;
      }

      x += (h * minRat) * Math.cos(fxang);
      y += (h * minRat) * Math.sin(fxang);
      if (isTop) {
        x += -w / 2 * Math.cos(qxang);
        y += -w / 2 * Math.sin(qxang);
      } else {
        x += w / 2 * Math.cos(qxang);
        y += w / 2 * Math.sin(qxang);
      }

      context.save()
      context.translate(x, y);
      if (isTop == true) {
        context.rotate((fxang * 180 / Math.PI - 90) * Math.PI / 180)
      } else {
        context.rotate((fxang * 180 / Math.PI + 180 - 90) * Math.PI / 180)
      }
      context.translate(-x, -y)
      context.fillStyle = baseConf.color;
      context.font = font;
      context.fillText(c, x, y, 15);
      context.restore();
    }
  }

  /**
   * 绘制 印章 内圆 中文 环绕文字
   * @param words 绘制文字内容
   */
  function writeChineseFont(words) {
    // 文字跨度
    let totalArcAng;
    // 文字字体
    let font;
    // 从边线向中心的移动因子
    let minRat;

    // 文字跨度
    totalArcAng = 160;
    // 文字大小、字体
    font = "42px " + baseConf.mainFont;
    // 从边线向中心的移动因子
    minRat = 4.3;

    let fontTextLen = words.length;
    let radiusWidth = radiusX + context.lineWidth;
    let radiusHeight = radiusY + context.lineWidth;

    //起始角度
    let startAngle = -90 - totalArcAng / 2;
    let step = 0.5;
    let alCount = Math.ceil(totalArcAng / step) + 1;
    let angleArr = new Array(alCount);
    let arcLenArr = new Array(alCount);
    let num = 0;
    let accArcLen = 0;
    angleArr[num] = startAngle;
    arcLenArr[num] = accArcLen;
    num++;
    let angR = startAngle * Math.PI / 180;
    let lastX = radiusX * Math.cos(angR) + radiusWidth;
    let lastY = radiusY * Math.sin(angR) + radiusHeight;

    for (let i = startAngle + step; num < alCount; i += step) {
      angR = i * Math.PI / 180;
      let x = radiusX * Math.cos(angR) + radiusWidth;
      let y = radiusY * Math.sin(angR) + radiusHeight;
      accArcLen += Math.sqrt((lastX - x) * (lastX - x) + (lastY - y) * (lastY - y));
      angleArr[num] = i;
      arcLenArr[num] = accArcLen;
      lastX = x;
      lastY = y;
      num++;
    }

    let arcPer = accArcLen / fontTextLen;
    for (let i = 0; i < fontTextLen; i++) {
      let arcL = i * arcPer + arcPer / 2;
      let ang = 0;

      for (let p = 0; p < arcLenArr.length - 1; p++) {
        if (arcLenArr[p] <= arcL && arcL <= arcLenArr[p + 1]) {
          ang = (arcL >= ((arcLenArr[p] + arcLenArr[p + 1]) / 2)) ? angleArr[p + 1] : angleArr[p];
          break;
        }
      }
      angR = (ang * Math.PI / 180);
      let x = radiusX * Math.cos(angR) + radiusX;
      let y = radiusY * Math.sin(angR) + radiusY;
      let qxang = Math.atan2(radiusY * Math.cos(angR), -radiusX * Math.sin(angR));
      let fxang = qxang + Math.PI / 2;

      let subIndex = i;
      let c = words[subIndex];
      let w = 25;
      let h = 31;


      x += (h * minRat) * Math.cos(fxang);
      y += (h * minRat) * Math.sin(fxang);

      x += -w / 2 * Math.cos(qxang);
      y += -w / 2 * Math.sin(qxang);

      context.save()
      context.translate(x, y);

      context.rotate((fxang * 180 / Math.PI - 90) * Math.PI / 180)

      context.translate(-x, -y)
      context.fillStyle = baseConf.color;
      context.font = font;
      if (fontTextLen < 20) {
        context.fillText(c, x, y);
      } else {
        context.fillText(c, x, y, 20);
      }
      context.restore();
    }
  }

  /**
   * 绘制椭圆
   */
  function drawEllipse(lineWidth, x, y, a, b) {
    context.fillStyle = 'rgba(255, 255, 255, 0)'; //背景透明
    context.strokeStyle = baseConf.color;
    context.lineWidth = lineWidth;

    let k = .5522848,
      ox = a * k, // 水平控制点偏移量
      oy = b * k; // 垂直控制点偏移量</p> <p>
    context.beginPath();
    //从椭圆的左端点开始顺时针绘制四条三次贝塞尔曲线
    context.moveTo(x - a, y);
    context.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b);
    context.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y);
    context.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b);
    context.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y);
    context.closePath();
    context.stroke();
  };

  //返回图片base64
  return canvas.toDataURL();
}


